在MicroBlaze上創建機器人彈奏手
2014/3/3 10:42:43
為了設計出可以演奏管風琴的機器人,我所在的dorkbot Edinburgh團隊(旨在推進工程科學界與藝術界之間的草根協作的非正式組織)開展了“Waldfl?te項目”。經過7個月的思考、探究和討論,我們最終設計出幾種操縱管風琴鍵盤的方式。
采用正確的機械部件
在開發的初始階段我們就明確地將問題分為機械和電子兩部分。如果我們能夠找到解決機械問題的方案,就能相對獨立地打造這兩個部分。
資金是設計的主要因素之一。我們走遍尾貨市場,找到了一些價格合適的電磁鐵。我們能夠以1英磅(約合1.5美元)左右的單價得到100個這樣的電磁鐵,于是訂購了6個在管風琴上進行試驗。
電磁鐵的尺寸非常理想,但電磁鐵芯的運動距離比要始終如一地觸動管風琴白鍵所需的運動距離略短。盡管我們可以直接利用電磁鐵芯來驅動黑鍵,但還是需要某種杠桿來驅動白鍵。
圖1 電磁體組件原型
電磁鐵組裝的首個原型如圖1所示,圖2為電磁鐵的工作原理圖。對于白鍵而言,頂部的膠合板杠桿的后面用管道膠帶作鉸鏈連接,當電磁鐵通電時,它會受到下拉的力量。當電磁鐵斷電時,管風琴鍵自身會提供向上力——因此無需另外使用彈簧。對于黑鍵而言,從電磁鐵底部伸出的小銷具有足夠的力量,可以直接按壓琴鍵,彈奏音符。
圖2 機械布局
組件測試表明設計的確可以成功地按壓琴鍵。同時也表明,我無法做到將放置電磁鐵的空間七等分,其間隔無法接近鍵盤八度音階的實際間隔,因此,我們只能一次測試一個鍵。但我們證實了這個原理是可行的,因此,我們訂購了適用于整個鍵盤的部件,然后開始著手電子設計。
圖3 基本電子結構圖
電子設計
在進行電子設計時,我們粗略地設計出電子結構,圖3為基本結構圖。在圖的左側,MIDI(樂器數字接口)消息由外部傳入(我將在下文詳細介紹MIDI協議)。圖的右側是一個位移寄存器鏈??刂破髟隍寗酉鄳摹皵祿敝堤畛湮灰萍拇嫫麈湑r負責切換“時鐘”信號,然后通過“選通”信號將位移寄存器鏈的內容并行發送至電磁鐵驅動器的輸入端。
我們在位移寄存器/驅動器鏈上采用了74HC595位移寄存器IC。電磁鐵試驗顯示每個電磁鐵大約需要15V電源提供350mA驅動電流——這超出了CMOS輸出級的提供范圍。為了滿足這個要求,我們在每個位移寄存器IC上增加了一個ULN2803A達林頓輸出級。這個芯片還具備一個保護二極管,對切斷電流時電磁鐵生成的高反激電壓進行分流,避免增加一個分立式二極管。我們在萬用板上制作了幾個驅動器電路板原型,每個可驅動16個電磁鐵。
控制器設計
可以采取多種方法設計控制器(包括利用Arduino平臺或采用其他微控制器)。我們最終選擇使用Spartan-3E入門套件,一是因為我在日常工作中用過這種開發板,對相關工具了如指掌。特別是我知道如何使用Platform Studio SDK和ChipScope等調試工具。由于機器彈奏風琴有可能是一個現場調試項目,這樣做可以節省時間。這里,我們使用賽靈思嵌入式開發套件開發核心組件MicroBlaze子系統,如圖4所示。
圖4 MicroBlaze子系統
除了MIDI接口和位移寄存器接口,我們還選擇增加了串行RS-232控制端口,以幫助調試系統。RS-232協議看起來有點老套,但在此類項目中,它很有價值。我們也增加了一些GPIO端口,用于驅動LED,讀取開關和按鈕,以便在無需使用控制端口的情況下完成某些交互操作。
寫入MicroBlaze固件
自20世紀80年代以來,MIDI已經成為連接合成器等數控樂器與其他樂器或控制計算機的標準接口,因此,我們確定系統的最佳輸入接口是MIDI端口。
MIDI是一種單向低速串行協議,傳輸速率為31250波特。它包含多種類型的信息,但就我們的目標應用而言,只有NOTE ON和NOTE OFF是重要的信息類型。每個NOTE ON信息由3個字節構成:第一個字節是0x9n,這里的n代表通道數;第二個字節是0~127的音符數,中間的C為第60號;第三個字節是0~127的速度值。
NOTE OFF除第一個字節是0x8n外,其余與此非常相似。
在設計中,我們決定同步聽取所有通道的信息(“omni”操作)。由于管風琴鍵盤對速度并不敏感,因此可以忽略所有速度字節。
EDK UART IP核接收MIDI消息,然后通過FIFO,一次向MicroBlaze處理器發送一條信息。MicroBlaze可從內部顯示整個鍵盤的狀態和系統正在按壓哪些鍵(即系統正在為哪些電磁鐵加電)。固件采用一個靜態查找表,指出與這個音符相關的電磁鐵,將這個靜態查找表用做內部圖的索引;到達的NOTE ON消息將相應entry值設為“1”,而NOTE OFF消息將entry值設為“0”。
內部圖更新后,利用圖的全部內容更新電磁鐵寄存器。通過GPIO端口的位拆解,MicroBlaze處理器一次將一位的圖內容寫入位移寄存器的數據輸入端,然后切換時鐘信號,移動一下位移寄存器。一旦利用圖內容對整個位移寄存器進行了更新,MicroBlaze會將一個上升沿寫入STROBE行,這能夠將位移寄存器的值拷貝至輸出寄存器,為正確的電磁鐵加電或斷電,從而產生悅耳的音樂。
我們將固件用作軟件狀態機。對于不采用實時操作系統的嵌入式應用而言,這可提供某些多線程應用功能,但沒有實際線程實現開銷。靜態結構數組根據當前的狀態,指出系統針對特定事件應當采取什么措施。
const midi_state_table_entry_t MIDI_STATE_TABLE[] =
{
{INHIBITED,PANIC,
MidiSM_Panic,INHIBITED},
{ANY_STATE,PANIC,
MidiSM_Panic,INIT},
{ANY_STATE,INHIBIT,
MidiSM_DoNothing,INHIBITED},
{ANY_STATE,OTHER_STATUS_RECEIVED,MidiSM_ClearMessage,INIT},
{INIT,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{INIT,DATA_RECEIVED,
MidiSM_DoNothing,INIT},
{NOTE_ON_OR_OFF,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF,DATA_RECEIVED,MidiSM_StoreNoteNumber,NOTE_ON_OR_OFF_NUMBER},
{NOTE_ON_OR_OFF_NUMBER,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte, NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF_NUMBER,DATA_RECEIVED,MidiSM_NoteOnOrOffComplete,NOTE_ON_OR_OFF},
{INHIBITED,ENABLE,
MidiSM_DoNothing,INIT},
{LAST_STATE, LAST_EVENT, 0,LAST_STATE},
};
在該結構體中的第一個entry表示當前狀態;第二個entry表示事件到達;第三個entry表示處理該事件需要使用狀態轉換功能;第四個 entry表示下一狀態。
狀態機業務端采用的代碼如下:
XStatus MidiSM_
DoStateTransition
(midi_state_machine_t *pInstance,u8 event)
{
const midi_state_table_
entry_t *pTable = pInstance-
>pStateTable;
// Search for a match in the
state table
do {
if ((event == pTable-
>received_event)
&& ((pInstance-
>current_state == pTable-
>state)
|| (pTable->state ==
ANY_STATE)))
{
(*pTable-
>transition_function)((v
oid *)pInstance);
pInstance->current_state
= pTable->next_state;
return XST_
SUCCESS;
}
pTable++;
} while (pTable->state !=LAST_STATE);
// Aaargh, something bad happened - should never get here
XASSERT_NONVOID_ALWAYS();
}
事件循環提供的事件是對這種功能的論證,根據當前的狀態和事件,采取某種措施和改變系統狀態。事件的類型包括字節到達MIDI接口,字符到達控制端口和按下重啟按鈕。重啟按鈕是保護耳朵和電源必備的特性——它可無條件地關閉所有電磁鐵,使系統恢復到已知安全狀態。
演奏Waldfl?e
電磁鐵木制背板隱藏在琴鍵底部,每塊板上安裝30個或更多的電磁鐵,同時還安裝了一些回收利用的罐狀電容器,為電磁鐵提供電能。我們將整個驅動器組件與管風琴連接,利用回收利用的CAT5電纜將Spartan-3E入門套件開發板和接口萬用板與驅動器組件連接。
我們利用這套系統成功演奏了一些非常復雜、快節奏的音樂,從古典到搖滾。電磁鐵和驅動器在速度方面并沒有表現出太大的局限性。即使在彈奏要求最苛刻的曲目時,電磁鐵電源在15V電壓條件下通常電流不超過4A。即使我們稍微過度使用電磁鐵,電磁鐵線圈也沒有出現明顯升溫的情況??偠灾覀儗@個系統非常滿意,同時為參與開發這套系統深感自豪。
作者:賽靈思公司設計經理 Gareth Edwards
來源:電子設計應用2009年第8期
采用正確的機械部件
在開發的初始階段我們就明確地將問題分為機械和電子兩部分。如果我們能夠找到解決機械問題的方案,就能相對獨立地打造這兩個部分。
資金是設計的主要因素之一。我們走遍尾貨市場,找到了一些價格合適的電磁鐵。我們能夠以1英磅(約合1.5美元)左右的單價得到100個這樣的電磁鐵,于是訂購了6個在管風琴上進行試驗。
電磁鐵的尺寸非常理想,但電磁鐵芯的運動距離比要始終如一地觸動管風琴白鍵所需的運動距離略短。盡管我們可以直接利用電磁鐵芯來驅動黑鍵,但還是需要某種杠桿來驅動白鍵。

圖1 電磁體組件原型
電磁鐵組裝的首個原型如圖1所示,圖2為電磁鐵的工作原理圖。對于白鍵而言,頂部的膠合板杠桿的后面用管道膠帶作鉸鏈連接,當電磁鐵通電時,它會受到下拉的力量。當電磁鐵斷電時,管風琴鍵自身會提供向上力——因此無需另外使用彈簧。對于黑鍵而言,從電磁鐵底部伸出的小銷具有足夠的力量,可以直接按壓琴鍵,彈奏音符。

圖2 機械布局
組件測試表明設計的確可以成功地按壓琴鍵。同時也表明,我無法做到將放置電磁鐵的空間七等分,其間隔無法接近鍵盤八度音階的實際間隔,因此,我們只能一次測試一個鍵。但我們證實了這個原理是可行的,因此,我們訂購了適用于整個鍵盤的部件,然后開始著手電子設計。

圖3 基本電子結構圖
電子設計
在進行電子設計時,我們粗略地設計出電子結構,圖3為基本結構圖。在圖的左側,MIDI(樂器數字接口)消息由外部傳入(我將在下文詳細介紹MIDI協議)。圖的右側是一個位移寄存器鏈??刂破髟隍寗酉鄳摹皵祿敝堤畛湮灰萍拇嫫麈湑r負責切換“時鐘”信號,然后通過“選通”信號將位移寄存器鏈的內容并行發送至電磁鐵驅動器的輸入端。
我們在位移寄存器/驅動器鏈上采用了74HC595位移寄存器IC。電磁鐵試驗顯示每個電磁鐵大約需要15V電源提供350mA驅動電流——這超出了CMOS輸出級的提供范圍。為了滿足這個要求,我們在每個位移寄存器IC上增加了一個ULN2803A達林頓輸出級。這個芯片還具備一個保護二極管,對切斷電流時電磁鐵生成的高反激電壓進行分流,避免增加一個分立式二極管。我們在萬用板上制作了幾個驅動器電路板原型,每個可驅動16個電磁鐵。
控制器設計
可以采取多種方法設計控制器(包括利用Arduino平臺或采用其他微控制器)。我們最終選擇使用Spartan-3E入門套件,一是因為我在日常工作中用過這種開發板,對相關工具了如指掌。特別是我知道如何使用Platform Studio SDK和ChipScope等調試工具。由于機器彈奏風琴有可能是一個現場調試項目,這樣做可以節省時間。這里,我們使用賽靈思嵌入式開發套件開發核心組件MicroBlaze子系統,如圖4所示。

圖4 MicroBlaze子系統
除了MIDI接口和位移寄存器接口,我們還選擇增加了串行RS-232控制端口,以幫助調試系統。RS-232協議看起來有點老套,但在此類項目中,它很有價值。我們也增加了一些GPIO端口,用于驅動LED,讀取開關和按鈕,以便在無需使用控制端口的情況下完成某些交互操作。
寫入MicroBlaze固件
自20世紀80年代以來,MIDI已經成為連接合成器等數控樂器與其他樂器或控制計算機的標準接口,因此,我們確定系統的最佳輸入接口是MIDI端口。
MIDI是一種單向低速串行協議,傳輸速率為31250波特。它包含多種類型的信息,但就我們的目標應用而言,只有NOTE ON和NOTE OFF是重要的信息類型。每個NOTE ON信息由3個字節構成:第一個字節是0x9n,這里的n代表通道數;第二個字節是0~127的音符數,中間的C為第60號;第三個字節是0~127的速度值。
NOTE OFF除第一個字節是0x8n外,其余與此非常相似。
在設計中,我們決定同步聽取所有通道的信息(“omni”操作)。由于管風琴鍵盤對速度并不敏感,因此可以忽略所有速度字節。
EDK UART IP核接收MIDI消息,然后通過FIFO,一次向MicroBlaze處理器發送一條信息。MicroBlaze可從內部顯示整個鍵盤的狀態和系統正在按壓哪些鍵(即系統正在為哪些電磁鐵加電)。固件采用一個靜態查找表,指出與這個音符相關的電磁鐵,將這個靜態查找表用做內部圖的索引;到達的NOTE ON消息將相應entry值設為“1”,而NOTE OFF消息將entry值設為“0”。
內部圖更新后,利用圖的全部內容更新電磁鐵寄存器。通過GPIO端口的位拆解,MicroBlaze處理器一次將一位的圖內容寫入位移寄存器的數據輸入端,然后切換時鐘信號,移動一下位移寄存器。一旦利用圖內容對整個位移寄存器進行了更新,MicroBlaze會將一個上升沿寫入STROBE行,這能夠將位移寄存器的值拷貝至輸出寄存器,為正確的電磁鐵加電或斷電,從而產生悅耳的音樂。
我們將固件用作軟件狀態機。對于不采用實時操作系統的嵌入式應用而言,這可提供某些多線程應用功能,但沒有實際線程實現開銷。靜態結構數組根據當前的狀態,指出系統針對特定事件應當采取什么措施。
const midi_state_table_entry_t MIDI_STATE_TABLE[] =
{
{INHIBITED,PANIC,
MidiSM_Panic,INHIBITED},
{ANY_STATE,PANIC,
MidiSM_Panic,INIT},
{ANY_STATE,INHIBIT,
MidiSM_DoNothing,INHIBITED},
{ANY_STATE,OTHER_STATUS_RECEIVED,MidiSM_ClearMessage,INIT},
{INIT,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{INIT,DATA_RECEIVED,
MidiSM_DoNothing,INIT},
{NOTE_ON_OR_OFF,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte,NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF,DATA_RECEIVED,MidiSM_StoreNoteNumber,NOTE_ON_OR_OFF_NUMBER},
{NOTE_ON_OR_OFF_NUMBER,NOTE_ON_OR_OFF_RECEIVED,MidiSM_StoreStatusByte, NOTE_ON_OR_OFF},
{NOTE_ON_OR_OFF_NUMBER,DATA_RECEIVED,MidiSM_NoteOnOrOffComplete,NOTE_ON_OR_OFF},
{INHIBITED,ENABLE,
MidiSM_DoNothing,INIT},
{LAST_STATE, LAST_EVENT, 0,LAST_STATE},
};
在該結構體中的第一個entry表示當前狀態;第二個entry表示事件到達;第三個entry表示處理該事件需要使用狀態轉換功能;第四個 entry表示下一狀態。
狀態機業務端采用的代碼如下:
XStatus MidiSM_
DoStateTransition
(midi_state_machine_t *pInstance,u8 event)
{
const midi_state_table_
entry_t *pTable = pInstance-
>pStateTable;
// Search for a match in the
state table
do {
if ((event == pTable-
>received_event)
&& ((pInstance-
>current_state == pTable-
>state)
|| (pTable->state ==
ANY_STATE)))
{
(*pTable-
>transition_function)((v
oid *)pInstance);
pInstance->current_state
= pTable->next_state;
return XST_
SUCCESS;
}
pTable++;
} while (pTable->state !=LAST_STATE);
// Aaargh, something bad happened - should never get here
XASSERT_NONVOID_ALWAYS();
}
事件循環提供的事件是對這種功能的論證,根據當前的狀態和事件,采取某種措施和改變系統狀態。事件的類型包括字節到達MIDI接口,字符到達控制端口和按下重啟按鈕。重啟按鈕是保護耳朵和電源必備的特性——它可無條件地關閉所有電磁鐵,使系統恢復到已知安全狀態。
演奏Waldfl?e
電磁鐵木制背板隱藏在琴鍵底部,每塊板上安裝30個或更多的電磁鐵,同時還安裝了一些回收利用的罐狀電容器,為電磁鐵提供電能。我們將整個驅動器組件與管風琴連接,利用回收利用的CAT5電纜將Spartan-3E入門套件開發板和接口萬用板與驅動器組件連接。
我們利用這套系統成功演奏了一些非常復雜、快節奏的音樂,從古典到搖滾。電磁鐵和驅動器在速度方面并沒有表現出太大的局限性。即使在彈奏要求最苛刻的曲目時,電磁鐵電源在15V電壓條件下通常電流不超過4A。即使我們稍微過度使用電磁鐵,電磁鐵線圈也沒有出現明顯升溫的情況??偠灾覀儗@個系統非常滿意,同時為參與開發這套系統深感自豪。
作者:賽靈思公司設計經理 Gareth Edwards
來源:電子設計應用2009年第8期

提交
查看更多評論
其他資訊
工業機器人控制系統的開放體系結構
工業機器人離線編程及無碰撞路徑規劃系統的開發研究
工業機器人手臂結構的有限元分析與研究
工業機器人通用控制器研究開發
工業機器人網絡控制與編程